package com.wangxu.blog.service.impl;

import com.alibaba.fastjson.JSON;
import com.wangxu.blog.dao.pojo.SysUser;
import com.wangxu.blog.service.LoginService;
import com.wangxu.blog.service.SysUserService;
import com.wangxu.blog.utils.JWTUtils;
import com.wangxu.blog.vo.ErrorCode;
import com.wangxu.blog.vo.Result;
import com.wangxu.blog.vo.params.LoginParams;
import org.apache.commons.codec.digest.DigestUtils;
import org.apache.commons.lang3.StringUtils;
import org.jetbrains.annotations.NotNull;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;

import java.util.Map;
import java.util.concurrent.TimeUnit;

@Service
public class LoginServiceImpl implements LoginService {
    //加密盐用于加密
    private static final String slot = "123456WanXu!@#$$";

    //用户操作
    @Autowired
    private SysUserService sysUserService;

    @Autowired
    RedisTemplate<String,String> redisTemplate;

    @Override          //@NotNull 被注释的元素不能为null
    public Result login(@NotNull LoginParams loginParams) {
        /*
        1、检查参数是否合法
        2、根据用户名和密码去user表中查询 是否存在
        3、如果不存在 登录失败
        4、如果存在，使用jwt生成token返回给前端
        5、token放入redis当中，redis token:user信息 设置过期时间（登录认证的时候，先认证token是否合法，去redis中认证是否存在）
         */
        String account = loginParams.getAccount();
        String password = loginParams.getPassword();
        /*
        在校验一个String类型的变量是否为空时，通常存在3中情况
            是否为 null
            是否为 “”
            是否为空字符串(引号中间有空格) 如： " "。
            制表符、换行符、换页符和回车
            StringUtils的isBlank()方法可以一次性校验这三种情况，返回值都是true,否则为false
         */
        if (StringUtils.isBlank(account) || StringUtils.isBlank(password)){
            return Result.fail(ErrorCode.PARAMS_ERROR.getCode(),ErrorCode.PARAMS_ERROR.getMsg());
        }
        password = DigestUtils.md5Hex(password + slot);
        System.err.println("password = " + password);
        SysUser sysUser = sysUserService.findUser(account,password);
        if (sysUser == null){
            return Result.fail(ErrorCode.ACCOUNT_PWD_NOT_EXIST.getCode(),ErrorCode.ACCOUNT_PWD_NOT_EXIST.getMsg());
        }
        String token = JWTUtils.createToken(sysUser.getId());
        //把用户信息放入redis中
        redisTemplate.opsForValue().set("TOKEN_"+token, JSON.toJSONString(sysUser),1, TimeUnit.DAYS);
        //把token信息返回给前端
        return Result.success(token);
    }

    @Override
    public SysUser checkToken(String token) {
        if (StringUtils.isBlank(token)){
            return null;
        }
        Map<String, Object> stringObjectMap = JWTUtils.checkToken(token);
        if (stringObjectMap == null){
            return null;
        }
        String userJson = redisTemplate.opsForValue().get("TOKEN_" + token); //获取redis中key为（"TOKEN_" + token）的值
        if (userJson == null){
            //如果为null，说明redis里的值已经过期
            return null;
        }
                    //JSON.parseObject() :根据SysUser.class将userJson解析成对象并返回
        return JSON.parseObject(userJson, SysUser.class);
    }

    @Override
    public Result logout(String token) {
        redisTemplate.delete("TOKEN_" + token);//删除redis中对应的key的值
        return Result.success(null);
    }

    @Override
    public Result register(LoginParams loginParams) {
        /*
        1、判断参数是否合法
        2、判断账户是否存在
                存在：返回账户已经被注册
        3、如果账户不存在
                注册用户
        4、生成token
        5、存入redis中并返回
        6、注意：加上事务，一旦中间任何过程出现问题，注册的用户 需要回滚
         */
        if (StringUtils.isBlank(loginParams.getAccount()) ||
                StringUtils.isBlank(loginParams.getPassword()) ||
                StringUtils.isBlank(loginParams.getNickname()))
                                    {
                return Result.fail(ErrorCode.PARAMS_ERROR.getCode(),ErrorCode.PARAMS_ERROR.getMsg());
        }
        SysUser sysUser =  sysUserService.findUserByAccount(loginParams.getAccount());
        if (sysUser != null){
            return Result.fail(ErrorCode.ACCOUNT_EXIST.getCode(),ErrorCode.ACCOUNT_EXIST.getMsg());
        }
        sysUser = new SysUser();
        sysUser.setNickname(loginParams.getNickname());
        sysUser.setAccount(loginParams.getAccount());
        sysUser.setPassword(DigestUtils.md5Hex(loginParams.getPassword()+slot));
        sysUser.setCreateDate(System.currentTimeMillis());
        sysUser.setLastLogin(System.currentTimeMillis());
        sysUser.setAvatar("/static/img/logo.b3a48c0.png");
        sysUser.setAdmin(1); //1 为true
        sysUser.setDeleted(0); // 0 为false
        sysUser.setSalt("");
        sysUser.setStatus("");
        sysUser.setEmail("");
        sysUserService.save(sysUser);
        System.out.println("sysUser.getId() = " + sysUser.getId());
        String token = JWTUtils.createToken(sysUser.getId()); //创建token
        //把用户信息放入redis中
        redisTemplate.opsForValue().set("TOKEN_"+token, JSON.toJSONString(sysUser),1, TimeUnit.DAYS);
        //把token信息返回给前端
        return Result.success(token);

    }
}
